package com.lorenzogao.lib_view

import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout

import com.lorenzogao.lib_view.ext.getScreenWidth
import com.lorenzogao.lib_view.ext.sp2px
import kotlin.math.abs

/**
 *  create by LorenzoGao
 *  email: 2508719070@qq.com
 *  TIME: 2019-11-08 10:28
 *  description:
 */


class TextView : View {


    private var mText: String? = null
    private var mTextSize = 15
    private var mTextColor = Color.BLACK


    private var mPaint: Paint


    // 构造行数 在new的时候调用
    constructor(context: Context?) : this(context, null)

    /**
     *    在布局layout使用
     *    <com.lorenzogao.lib_view.TextView
     *     android:layout_width="wrap_content"
     *     android:layout_height="wrap_content"
     *     android:text="Hello World!"/>
     */

    constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0)

    /**
     * 在布局中使用中，但是会有style(自定义属性)
     *
     *   <declare-styleable name="TextView">
     *    <attr name="textColor" format="color"></attr>
     *    </declare-styleable>
     *
     */
    @SuppressLint("ResourceAsColor")
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {

        val array = context?.obtainStyledAttributes(attrs, R.styleable.TextView)
        array?.apply {

            mText = getString(R.styleable.TextView_customText)

            mTextColor = getColor(R.styleable.TextView_customTextColor, mTextColor)
            // 是 15px 还是15sp
            mTextSize = getDimensionPixelSize(R.styleable.TextView_customTextSize, mTextSize.sp2px(context))

            recycle()


        }


        // 设置字体 画笔的大小和颜色
        mPaint = Paint()
        mPaint.isAntiAlias = true
        mPaint.textSize = mTextSize.toFloat()
        mPaint.color = mTextColor
        //    这是继承LinearLayout
//        if (background!=null){
//            setBackgroundColor(android.R.color.transparent)
//        }


        //  这是继承LinearLayout
//        setWillNotDraw(false)
    }


    /**
     * 测量方法
     */
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        // 布局的宽高都是这个方法指定

        //获取宽高的模式  wrap_content match_parent 具体的数值
        var widthMode = MeasureSpec.getMode(widthMeasureSpec)
        var heightMode = MeasureSpec.getMode(heightMeasureSpec)

        // 确定的值 不需要计算
        var width = MeasureSpec.getSize(widthMeasureSpec)
        var height = MeasureSpec.getSize(heightMeasureSpec)

        val bounds = Rect()
        mPaint.getTextBounds(mText!!, 0, mText!!.length, bounds)


        if (widthMode == MeasureSpec.AT_MOST) {
            // 计算 以长度 、字体、padding 有关 有Paint来测量
            width = bounds.width() + paddingLeft + paddingRight
        }

        if (heightMode == MeasureSpec.AT_MOST) {
            height = bounds.height() + paddingTop + paddingBottom
        }


        setMeasuredDimension(width, height)


    }


    // 用来绘制
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)

        // 画文本　
        // x 开始位置
        // y 基线

        var fontMetrics = mPaint.fontMetrics
        //ascent 是一个负值 采用绝对值 让他为正值
        val dx = (abs(fontMetrics.ascent) + fontMetrics.descent) / 2 - fontMetrics.descent
        val baseline = height / 2 + dx
        canvas.drawText(mText!!, paddingLeft.toFloat(), baseline, mPaint)


        //画弧
        //canvas.drawArc()
        //画圆
//        canvas.drawCircle()


    }


    // Step 1 这是继承LinearLayout
    override fun dispatchDraw(canvas: Canvas) {
        super.dispatchDraw(canvas)

    }


    /**
     * 触摸方法
     */
    override fun onTouchEvent(event: MotionEvent?): Boolean {

        when (event?.action) {
            //手指抬起
            MotionEvent.ACTION_UP -> {

            }
            //手指移动
            MotionEvent.ACTION_MOVE -> {

            }
            //手指按下
            MotionEvent.ACTION_DOWN -> {

            }

        }

        return super.onTouchEvent(event)
    }

}